use crate::api::model::KeyInfoResp;
use crate::api::model::SignResponse;
use crate::api::model::VerifyAndUpdateResponse;
use crate::key_manager::error::KeyManagerError;
use crate::key_manager::model::VerifyAndUpdateParam;
use async_trait::async_trait;

/**
 * 密码学操作接口
 */
#[async_trait]
pub trait CryptoOperations {
    /**
     * 签名
     *
     * @param data 待签名的数据
     * @return 签名值
     * */
    async fn sign(&self, data: &Vec<u8>, key_type: &str) -> Result<SignResponse, KeyManagerError>;

    /**
     * 验证签名
     *
     * @param data 待验证的数据
     * @param signature 签名值
     * 验证签名并更新密钥
     *
     * @param key_type 密钥类型
     * @param key_version 密钥版本
     * @param data 待验证的数据
     * @param signature 签名值
     * @return 验证签名并更新密钥结果
     * */
    async fn verify_and_update(
        &self,
        param: &VerifyAndUpdateParam,
    ) -> Result<VerifyAndUpdateResponse, KeyManagerError>;

    /**
     * 获取公钥
     *
     * @param version 密钥版本
     * @return 公钥
     * */
    async fn get_public_key(
        &self,
        key_type: &str,
        version: Option<&str>,
    ) -> Result<KeyInfoResp, KeyManagerError>;

    /**
     * 获取私钥
     *
     * @param version 密钥版本
     * @return 私钥
     * */
    async fn get_private_key(
        &self,
        key_type: &str,
        version: Option<&str>,
    ) -> Result<KeyInfoResp, KeyManagerError>;

    /**
     * 验证签名
     *
     * @param data 待验证的数据
     * @param signature 签名值
     * @param key_type 密钥类型
     * @return 验证签名结果
     * */
    async fn verify(
        &self,
        key_type: &str,
        key_version: Option<&str>,
        data: Vec<u8>,
        signature: Vec<u8>,
    ) -> Result<bool, KeyManagerError>;
}
